2017-07-01 11 views
0

を保存しないI私は休止状態を使用して保存したい、次のオブジェクトがあります。Hibernateは複雑なオブジェクト

@Entity 
@Table(name = "setting") 
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class Setting 
{ 
    @Id 
    @Column(name = "id") 
    public String internalID; 
    @Column(name = "name") 
    public String name; 
    @Column(name = "type") 
    public String type; 
    @Column(name = "regex") 
    public String regex; 

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinTable(name = "setting", 
      joinColumns = {@JoinColumn(name = "parent_id")}, 
      inverseJoinColumns = {@JoinColumn(name = "id")}) 
    public Collection<Setting> children; 

    @JsonIgnore 
    @Column(name = "parent_id") 
    public String parentID; 

    @Column(name = "value") 
    public String value; 

    public Setting() 
    { 
     this.internalID = UUID.randomUUID().toString(); 
    } 
} 

Hibernateはこれを保存しようとするが、子オブジェクトで失敗しているようだが。 深さが3層のSettingオブジェクトを作成すると、最初の2つのレイヤーだけが保存され、3つ目のレイヤーは無視されます。

さらに、2番目のレイヤーではinternalIDとparentIDのみが保存され、name、type、およびregex nullはデータベースに残ります。データベースのセーブ機能

public static void saveObject(Object obj) 
{ 
    if(sessionFactory == null) 
     init(); 
    try(Session session = sessionFactory.openSession()) 
    { 
     session.beginTransaction(); 
     session.save(obj); 
     session.getTransaction().commit(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

それは私が行方不明だということは何ですか? 注釈が間違っていますか?

再現手順:

CREATE SCHEMA `cosmos` ; 

CREATE TABLE `cosmos`.`setting` (
    `id` VARCHAR(64) NOT NULL, 
    `name` VARCHAR(256) NULL, 
    `type` VARCHAR(7) NOT NULL, 
    `regex` VARCHAR(512) NULL, 
    `value` VARCHAR(512) NULL, 
    `parent_id` VARCHAR(64) NULL, 
    PRIMARY KEY (`id`)); 

CREATE TABLE `cosmos`.`setting_relation` (
    `id` VARCHAR(64) NOT NULL, 
    `parent_id` VARCHAR(64) NULL, 
    PRIMARY KEY (`id`)); 

と設定:

<hibernate-configuration> 
    <session-factory name="localConnection"> 
     <property name="hibernate.dialect"> 
      org.hibernate.dialect.MySQLDialect 
     </property> 
     <property name="hibernate.connection.driver_class"> 
      com.mysql.jdbc.Driver 
     </property> 

     <property 
       name="hibernate.connection.url"> 
      jdbc:mysql://localhost:3306/cosmos?useSSL=false 
     </property> 
     <property name="hibernate.connection.username"> 
      root 
     </property> 
     <property name="hibernate.connection.password"> 
      **** 
     </property> 

     <!-- List of XML mapping files --> 
     <mapping class="se.mulander.cosmos.settings.model.Setting"/> 
    </session-factory> 
</hibernate-configuration> 

答えて

1

@JoinTable(名前= "setting_some_name" の代わりに@JoinTableを試すSQLと

public static void test() 
{ 
    Setting outer = new Setting(); 
    outer.name = "Outer"; 
    Setting inner = new Setting(); 
    inner.name = "Inner"; 
    outer.children = new ArrayList<>(); 
    outer.children.add(inner); 
    saveObject(outer); 
} 

public static void saveObject(Object obj) 
{ 
    if(sessionFactory == null) 
     initDB(); 
    try(Session session = sessionFactory.openSession()) 
    { 
     session.beginTransaction(); 
     session.save(obj); 
     session.getTransaction().commit(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

private static SessionFactory sessionFactory; 

private static void initDB() 
{ 
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure() // configures settings from hibernate.cfg.xml 
      .build(); 
    sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); 
    Runtime.getRuntime().addShutdownHook(new Thread(() -> 
    { 
     StandardServiceRegistryBuilder.destroy(registry); 
    })); 
} 

(名称=「設定」

012あなたが同じテーブルに自己結合でそれをしたい場合は

または、次の操作を行います。

@ManyToOne(optional = true) 
@JoinColumn(name = "parent_id") 
public Setting parent; 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent" , cascade = {CascadeType.ALL}) 
public Collection<Setting> children; 
+0

http://i.imgur.com/PyadZkm.png Hibernateは:挿入(名前、PARENT_IDを設定することに これは1つの保存を試行するだけです... – munHunger

+0

私はバリアント2のマッピングを更新しました。show_sqlを使って試してみてください。.....(これは、正規表現、型、値、ID) @ManyToOne(オプション= true) @JoinColumn(name = "parent_id") public親を設定します。 @OneToMany(fetch = FetchType.EAGER、mappedBy = "親"、カスケード= {CascadeType.ALL}) public Collection children; – xyz

+0

Plsはspamのように見えるすべてのコメントを削除し、このマッピングを試して結果を出します。そしてSQLログ – xyz

関連する問題