Hibernate zeroToOne

Я пытаюсь установить отношения между двумя объектами, которые были бы равны нулю. То есть Родитель может быть сохранен без связанной дочерней сущности, а также вместе с ассоциированным дочерним объектом. Ниже приведены 2 класса сущностей ...


Employee (Parent)

public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="EMP_NAME")
    private String name;

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = {CascadeType.ALL})
    private EmployeeInfo info;

    @Column(name="EMP_ENUM")
    private Integer enumId;

EmployeeInfo (Child)

public class EmployeeInfo {
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;

        @Column(name="EMPLOYEE_EMAIL")
        private String email;

При таком типе столбца отношения и идентификатора единственной таблицы Parent (Employee) установлено значение AUTO INCREMENT в БД MySql проблема заключается в том, что при сохранении графа объекта Parent-> Child я получаю следующее исключение

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into EMP_INFO 
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value

. Я попытался установить для свойства Id дочерней таблицы значение AUTO INCREMENT в БД , и сохранение такого графа объекта Parent-> Child успешно. However, the problem described here surfaces, because I have a scenario in which I would like to save the parent (Employee) object without the associated EmpInfo object, and hence do NOT want to have AUTO INCREMENT on the Child's id column.


One solution could be not use the PrimaryKeyJoinColumn, but use a particular JoinColumn, but that adds an unnecessary column to my existing Table.


Has anyone come across such a problem? If yes, any pointers would be much helpful.

1
задан Pascal Thivent 18 August 2010 в 06:59
поделиться

2 ответа

Наконец, он заработал благодаря Паскалю и поиску в Google. По-видимому, я не могу использовать собственный генератор ключей для таких отношений, когда родительский элемент может существовать без дочернего элемента (необязательно = true). В конце концов, сработало следующее, оставив мне обратную сторону - иметь дело с аннотациями, специфичными для Hibernate (@GenericGenerator), а также иметь дело с двунаправленными отношениями вместо однонаправленных, которые я хотел.

Employee (Parent) class remains unchanged as above. It has AUTO INCREMENT on the Id column.

Что касается дочернего класса (EmployeeInfo), он изменился на следующий, и снова БЕЗ , для которого в столбце Id задано значение AUTO INCREMENT.

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
    @Id
    @GeneratedValue(generator="foreign")
    @GenericGenerator(name="foreign", strategy = "foreign", parameters={
    @Parameter(name="property", value="verifInfo")}) 
    private Long id;

    @OneToOne(optional=false)
    @JoinColumn (name="id")
    private Employee emp;

    @Column(name="EMPLOYEE_EMAIL")
    private String email;

Это помогло мне достичь того, чего я хотел, но с другой стороны, GenericGenerator не является аннотацией JPA, это аннотация спящего режима, и, к сожалению, мне приходится обходиться с этим на данный момент, потому что JPA в настоящее время не поддерживает это (или какие-либо аналогично) аннотация.

Во всяком случае, помогает в таких случаях: -)

1
ответ дан 2 September 2019 в 22:06
поделиться

У меня есть сценарий, в котором я хотел бы сохранить родительский объект (Employee) без связанного объекта EmpInfo.

Необязательный атрибут в OneToOne по умолчанию имеет значение истина , что вам и нужно.

Однако вы каким-то образом неправильно используете @PrimaryKeyJoinColumn здесь (ну, на самом деле это зависит от того, чего вы действительно хотите достичь, но ваша текущая комбинация аннотаций неверна).

ЕСЛИ вы хотите сопоставить OneToOne с общим первичным ключом , используйте @PrimaryKeyJoinColumn . Но в этом случае не используйте GeneratedValue в EmployeeInfo и не устанавливайте идентификатор вручную или, если вы не хотите устанавливать его вручную, используйте специальный Hibernate чужой генератор, который я уже упоминал в ваш предыдущий вопрос . Также проверьте соответствующий вопрос, указанный ниже.

И ЕСЛИ вы не хотите использовать общий первичный ключ (как в вашем текущем коде, поскольку вы пытаетесь получить идентификатор, сгенерированный базой данных), тогда не используйте PrimaryKeyJoinColumn .

Вы должны сделать выбор.

Ссылки

  • Спецификация JPA 1.0:
    • 9.1.32 PrimaryKeyJoinColumn Аннотация

Связанный вопрос

1
ответ дан 2 September 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: