je une entité JPA qui stocke un identifiant de fk, un booléen et un horodatage:Enregistrement d'une entité JPA où seuls les changements d'horodatage des résultats dans les mises à jour plutôt que des inserts (souhaitée)
@Entity
public class ChannelInUse implements Serializable {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(nullable = false)
private Channel channel;
private boolean inUse = false;
@Temporal(TemporalType.TIMESTAMP)
private Date inUseAt = new Date();
...
}
Je veux que chaque nouvelle instance de cette entité pour aboutir à une nouvelle ligne dans la table. Pour une raison quelconque, peu importe ce que je fais, la ligne est toujours mise à jour avec une nouvelle valeur d'horodatage plutôt que de créer une nouvelle ligne. J'ai même essayé d'utiliser une requête native pour lancer une insertion, mais l'identifiant de la chaîne n'était pas encore disponible, j'ai donc abandonné. J'ai essayé d'utiliser une classe d'ID incorporée consistant en channel.getId et inUseAt. Mes égaux et hashCode pour sont:
public boolean equals(Object obj){
if(this == obj)
return true;
if(!(obj instanceof ChannelInUse))
return false;
ChannelInUse ciu = (ChannelInUse) obj;
return ((this.inUseAt == null ? ciu.inUseAt == null : this.inUseAt.equals(ciu.inUseAt))
&& (this.inUse == ciu.inUse)
&& (this.channel == null ? ciu.channel == null : this.channel.equals(ciu.channel))
);
}
/**
* hashcode generated from at, channel and inUse properties.
*/
public int hashCode(){
int hash = 1;
hash = hash * 31 + (this.inUseAt == null ? 0 : this.inUseAt.hashCode());
hash = hash * 31 + (this.channel == null ? 0 : this.channel.hashCode());
if(inUse)
hash = hash * 31 + 1;
else
hash = hash * 31 + 0;
return hash;
}
}
J'ai essayé d'utiliser l'annotation Entité de mise en veille prolongée avec mutable = false. Je ne comprends probablement pas ce qui rend une entité unique ou quelque chose. Frappez le google assez dur, mais ne peut pas comprendre celui-là.
MISE À JOUR: Ajout de code persistent:
public void store(Map<String, String> params,
Map<?, ?> values) throws Exception {
VoiceInterface iface = (VoiceInterface) getStorageUnit(params);
ALeafPort leafPort = getLeafPort(iface);
SortedSet<Channel> channels = leafPort.getChannels();
Iterator<Channel> it = channels.iterator();
while(it.hasNext()){
Channel c = it.next();
ChannelInUse ciu = new ChannelInUse(c,
((Boolean) values.get(c.getNumber())).booleanValue());
em.persist(ciu);
}
}
getStorageUnit et getLeafPort regarder les objets appropriés de stockage (ou les crée si elles n'existent pas).
Les méthodes 'equals' et' hashCode' devraient être sans importance. Vous créez deux entites ('new ChannelInUse()'), persistez chacun d'eux, et le second écrase le premier? Cela semble bizarre. Pouvez-vous montrer le code? – Henning
Code ajouté. Je itère sur une liste de canaux, puis crée un nouvel objet ChannelInUse pour chacun avec son statut actuel dans le constructeur puis persiste. Il écrase inUse et inUseAt, mais il maintient une ligne pour chaque canal - comme son canal traitant comme seule identité même s'il n'est même pas utilisé comme clé primaire ou dans une clé composée n'importe où. Est-ce parce que je suis sur une liste de canaux? En quelque sorte? –