Хранение объекта jpa, в котором только метка времени изменяет результаты, а не вставки (желательно) - PullRequest
0 голосов
/ 11 мая 2010

У меня есть сущность 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 ищут нужные объекты из хранилища (или создают их, если они не существуют).

1 Ответ

0 голосов
/ 12 мая 2010

Да, следует следить за этим свойством hbm2ddl.auto = create. К сожалению!

...