Java: Hibernate @OneToOne mapping

旧时模样 提交于 2019-11-26 13:05:02

问题


I\'m trying to get Hibernate @OneToOne annotations working and not having much success here...

Let\'s say I\'ve got a table called status that looks like this:

+------------------------------------------------+
|                     status                     |
+------------------------------------------------+
| id | frn_user_id | frn_content_id |   status   |
+----+-------------+----------------+------------+
|  1 |     111     |        0       |  \"active\"  |
+----+-------------+----------------+------------+
|  2 |      0      |       222      | \"inactive\" |
+----+-------------+----------------+------------+

And I\'ve got an entity for User that looks like this:

@Entity
@Table(name = \"user\")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = \"id\", nullable = false)
    private Integer id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = \"userId\")
    private Status status;

    // getters and setters
}

And a similar one for Content, and another entity for Status that looks like this:

@Entity
@Table(name = \"status\")
public class Status {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = \"id\", nullable = false)
    private Integer id;

    @Column(name = \"frn_user_id\")
    private Integer userId;

    @Column(name = \"frn_content_id\")
    private Integer contentId;

    @Column(name = \"status\")
    private String status;

    // getters and setters
}

When I perform a read on User, I expect that User.getStatus() will return a Status object with id=1. Instead, I get an AnnotationException: \"Referenced property not a (One|Many)ToOne: Status.userId in mappedBy User.status\"

I\'ve poured through docs, tutorials and examples here on SO, but everything I\'ve tried so far has failed.

Also worth noting: This should support a one-to-zero-or-one relationship, as some user and content records will not have a reference in the status table.

Any help would be greatly appreciated!


回答1:


Your Status entity must not have properties userId and contentId of type Integer, mapped with @Column. It must have properties user and content of type User and Content, mapped with @OneToOne:

public class User {
    @OneToOne(mappedBy = "user")
    private Status status;
    // ...
}

public class Status {
    @OneToOne
    @JoinColumn(name = "frn_user_id")
    private User user;
    // ...
}

A user has one status. A status has one user.




回答2:


use this way. Add below field in Customer entity.

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
private Status status;

and don't add getter and setter for status field in Customer entity. And add below code to Status Entity.

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;

Here add the getter and setter for customer field in Status Entity class. You can see one working example here.



来源:https://stackoverflow.com/questions/21762328/java-hibernate-onetoone-mapping

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!