JPA / Hibernate Persist каскады, даже если это не должно - PullRequest
2 голосов
/ 03 ноября 2011

Я получил эти 2 сущности:

@javax.persistence.Entity
public class Book {
    @javax.persistence.EmbeddedId
    private BookPK id;

    private String title;

    @javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.LAZY)
    @javax.persistence.JoinColumns({ 
            @javax.persistence.JoinColumn(name = "LNGCOD", referencedColumnName = "LNGCOD"),
            @javax.persistence.JoinColumn(name = "LIBCOD", referencedColumnName = "LIBCOD") })
    private Language language;
}

@javax.persistence.Entity
public class Language {
    @javax.persistence.EmbeddedId
    private LanguagePK id;

    private String name;
}

с составными PK:

@Embeddable
public class BookPK implements Serializable {
    private Integer bookcod;
    private Integer libcod;
}

@Embeddable
public class LanguagePK implements Serializable {
    private Integer lngcod;
    private Integer libcod;
}

Если я попытаюсь создать новую Книгу и сохранить ее, я получу исключение, сообщающее мне libcodвстречается дважды в операторе вставки («Столбец 'libcod' указан дважды»).Но я не могу использовать «inserttable = false» при определении JoinColumn («Смешивать вставляемые и не вставляемые столбцы в свойстве запрещено»).

Есть ли способ определить эти объекты + отношения, чтобыHibernate автоматически управляет столбцами?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Hibernate и JPA автоматически делают постоянными все изменения, внесенные в постоянные объекты, пока они подключены к сеансу.В этом весь смысл ORM: вы загружаете постоянный объект, изменяете его, и новое состояние автоматически сохраняется при фиксации транзакции, без необходимости вызывать persist, merge, save или любой другой метод.

Обратите внимание, что вызов persist для постоянных объектов (за исключением его каскадных побочных эффектов) не имеет смысла.persist должен сделать временную сущность (т.е. новую, еще не в базе данных, без сгенерированного идентификатора) постоянной.

0 голосов
/ 03 ноября 2011

Вы можете иметь только один мутатор для libcod.Вероятно, вам следует оставить геттер libcod в классе BookPK, а в классе Language использовать ссылку joincolumn с ссылкой на libcod.Он отлично работает для классов с одним встроенным PK, но для нескольких классов PK вам, возможно, придется поиграться.

Итак, в вашем классе Language у вас будет это.

    @javax.persistence.Entity public class Language {

    private LanguagePK id;
    private Integer    libcod;

    @javax.persistence.EmbeddedId @AttributeOverrides({
        @AttributeOverride(name = "lngcod", column = @Column(name = "LNGCOD", nullable = false)),
        @AttributeOverride(name = "libcod", column = @Column(name = "LIBCOD", nullable = false)) })
    public LanguagePK getId() {
            return this.id;
    }
     public void setId(LanguagePK id) {
          this.id = id;
    }    


    @ManyToOne(fetch = FetchType.LAZY)

       @JoinColumn(name = "LIBCOD", insertable = false , updatable = false)
         public Integer getLibcod() {
       return this.libcod;
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...