Как создать и обработать составной первичный ключ в JPA

Я хочу иметь версии из той же записи данных. Другими словами, я хочу дублировать запись с другим номером версии.

id - Version будет первичным ключом.

Как должна выглядеть сущность? Как я могу скопировать его с другой версией?

id Version ColumnA

1   0      Some data
1   1      Some Other data
2   0      Data 2. Entry
2   1      Data

Ответы на вопрос(5)

таких как @ManyToOne

 Buhake Sindi29 июн. 2018 г., 21:11
Почему нет? Вы смотрели на этопример?

Serializable если вы используете@IdClass

@IdClass аннотации, еще один совет, который я нашел, это@Column аннотация должна идти в поля класса Entity (YourEntity в примере кода Рохитджан).

 Alex Oliveira04 нояб. 2018 г., 14:47
Оставьте комментарий к ответу Рохита вместо того, чтобы публиковать новый ответ.

Ключевой класс:

@Embeddable
@Access (AccessType.FIELD)
public class EntryKey implements Serializable {

    public EntryKey() {
    }

    public EntryKey(final Long id, final Long version) {
        this.id = id;
        this.version = version;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return this.version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof EntryKey))
            return false;
        EntryKey castOther = (EntryKey) other;
        return id.equals(castOther.id) && version.equals(castOther.version);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.id.hashCode();
        hash = hash * prime + this.version.hashCode();
        return hash;
    }

    @Column (name = "ID")
    private Long id;
    @Column (name = "VERSION")
    private Long operatorId;
}

Класс сущности:

@Entity
@Table (name = "YOUR_TABLE_NAME")
public class Entry implements Serializable {

    @EmbeddedId
    public EntryKey getKey() {
        return this.key;
    }

    public void setKey(EntryKey id) {
        this.id = id;
    }

    ...

    private EntryKey key;
    ...
}

Как я могу скопировать его с другой версией?

Вы можете отсоединить сущность, полученную от провайдера, изменить ключ Entry и затем сохранить его как новую сущность.

 Bruce Sun26 мар. 2017 г., 04:33
Мне также интересно, как вычислить хэш для 2 длинных первичных ключей. Что касаетсяhash а такжеprime в методеhashCode в классеEntryKeyМожете ли вы сказать мне, откуда эта идея?
 Kayser23 окт. 2012 г., 17:35
Можно ли определить идентификатор в EntrykeyAUTOGENERATED, Одер что-то подобное@GeneratedValue(strategy = GenerationType.IDENTITY)
Решение Вопроса

Embedded class, который содержит ваши два ключа, а затем иметь ссылку на этот класс какEmbeddedId в вашейEntity.

Вам понадобится@EmbeddedId а также@Embeddable аннотаций.

@Entity
public class YourEntity {
    @EmbeddedId
    private MyKey myKey;

    @Column(name = "ColumnA")
    private String columnA;

    /** Your getters and setters **/
}
@Embeddable
public class MyKey implements Serializable {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Version", nullable = false)
    private int version;

    /** getters and setters **/
}

Еще один способ решить эту задачу - использовать@IdClass аннотации, и поместите как вашиid в этомIdClass, Теперь вы можете использовать обычный@Id аннотация на оба атрибута

@Entity
@IdClass(MyKey.class)
public class YourEntity {
   @Id
   private int id;
   @Id
   private int version;

}

public class MyKey implements Serializable {
   private int id;
   private int version;
}
 Rohit Jain24 окт. 2012 г., 10:16
@Kayser. Насколько мне известно. Нет. Вы должны явно установить значение для них в вашем экземпляре KeyClass, а затем установить этот экземпляр класса ключей в вашем Entity.
 Kayser24 окт. 2012 г., 10:15
Можно ли использовать@Generatedvalue для идентификаторов по EmbeddedId
 Rohit Jain24 окт. 2012 г., 10:17
@Kayser.@GeneratedValue может использоваться только для генерации значений ключей для первичного ключа, он не может генерировать комбинацию для составных ключей.
 Lucas31 мар. 2014 г., 12:15
@RohitJain только одно: вы фактически не можете сделать общедоступный встроенный класс (должен быть в своем собственном файле, чтобы быть публичным)
 radlan05 мар. 2018 г., 16:54
@FastEngy К нему все еще можно получить доступ через Wayback Machine:web.archive.org/web/20170123035517/http://uaihebert.com/..., Кажется, что эта статья замененаweb.archive.org/web/20170202203555/http://uaihebert.com/... а такжеweb.archive.org/web/20161014051056/http://uaihebert.com/... который также исчез ...

Ваш ответ на вопрос