У меня есть сущность JPA, в которой хранится идентификатор fk, логическое значение и отметка времени:
@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();
...
}
Я хочу, чтобы каждый новый экземпляр этой сущности приводил к новой строке в таблице. По какой-либо причине, независимо от того, что я делаю, это всегда приводит к тому, что строка обновляется с новым значением временной метки, а не создается новая строка. Даже пытался использовать собственный запрос для запуска вставки, но идентификатор канала еще не был заполнен, поэтому я отказался от этого. Я попытался использовать встроенный класс id, состоящий из channel.getId и inUseAt. Мои равные и хеш-код для:
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;
}
}
Я пытался использовать аннотацию Entity hibernate с mutable = false. Я, наверное, просто не понимаю, что делает сущность уникальной или что-то в этом роде. Ударил Google довольно сильно, но не могу понять это.
ОБНОВЛЕНИЕ: добавление постоянного кода:
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 и getLeafPort ищут нужные объекты из хранилища (или создают их, если они не существуют).