有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有相同主键和外键双向关系的java Hibernate实体OneToOne

我有两个表:配置表和组织表,如下所示:

T_Organization
ID (Primary Key)
Name
Address

T_Configuration
Organization_ID (Primary_Key and Foreign Key)
Name
Some Configs

我已通过以下操作成功地从配置实体添加了单向关系:

@Id
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "organizations_id", referencedColumnName="id")
Organization id;

但是,我试图在组织的实体中添加一个成员变量,以便可以从组织对象访问配置值

我正在努力:

@OneToOne
@PrimaryKeyJoinColumn
private ConfigurationEntity organizationId;

然而,我在启动时遇到了以下例外情况:

[talledLocalContainer] Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'this_.organizationId' in 'field list'
[talledLocalContainer]  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.7.0_79]
[talledLocalContainer]  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[?:1.7.0_79]
[talledLocalContainer]  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.7.0_79]
[talledLocalContainer]  at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[?:1.7.0_79]
[talledLocalContainer]  at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.Util.getInstance(Util.java:383) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2002) ~[mysql-connector-java-5.1.36.jar:5.1.36]
[talledLocalContainer]  at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:404) ~[c3p0-0.9.5-pre10.jar:0.9.5-pre10]
[talledLocalContainer]  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
[talledLocalContainer]  ... 61 more

我在这里找到了解决方案http://websystique.com/hibernate/hibernate-one-to-one-unidirectional-with-shared-primary-key-annotation-example/

关于我为什么会看到这个有什么建议吗

编辑以包含文件:

组织。爪哇

@SuppressWarnings("serial")
@Entity
@Table(name="t_organization")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@DynamicUpdate
@Indexed
@Data
public class Organization implements Serializable{
    @DocumentId
    @Id @GeneratedValue @Column(name="id")
    private long id;
    @Column(name="name")
    private String name;
    @Column(name="address")
    private String address;
}

配置实体。爪哇

@SuppressWarnings("serial")
@Entity
@Table(name = "t_configuration")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@DynamicUpdate
@Data
public class Configuration implements Serializable {
    @Id
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "organization_id", referencedColumnName="id")
    Organization id;

    @Column(name = "name")
    String name;
}

编辑:编辑:解决方案: 组织爪哇

@SuppressWarnings("serial")
@Entity
@Table(name="t_organization")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@DynamicUpdate
@Indexed
@Data
public class Organization implements Serializable{
    @DocumentId
    @Id @GeneratedValue @Column(name="id")
    private long id;
    @Column(name="name")
    private String name;
    @Column(name="address")
    private String address;

        @Getter
@Setter
@OneToOne(mappedBy="organization", fetch = FetchType.LAZY, orphanRemoval=true)
private ConfigurationEntity configurationEntity;
}

配置实体。爪哇

@SuppressWarnings("serial")
@Entity
@Table(name = "t_configuration")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@DynamicUpdate
@Data
public class Configuration implements Serializable {
@Id
@Column(name="organizations_id")
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign",parameters=@Parameter(name="property", value="organization"))
long id;

@OneToOne
@PrimaryKeyJoinColumn
private Organization organization;

@Column(name = "name")
String name;
}

共 (1) 个答案

  1. # 1 楼答案

    However I am trying to add a member variable inside of the Organization's entity so that I can access configuration values from the Organization object.

    要做到这一点,你必须做的是使一对一的关系双向,如下所示:

    public class Organization implements Serializable{
        @Id @GeneratedValue @Column(name="id")
        private long id;
    
        private String name;
        private String address;
    
        @OneToOne(mappedBy = "id")
        private Configuration configuration;
    
       // getters + setters
    }