2017-09-09 9 views
0

안녕하세요 저는 최대 절전 모드를 배우기 시작했습니다. 내가 실수를하고있는 곳을 바로 잡아주십시오. 최대 절전 모드 주석을 사용하는 조인 테이블을 사용하여 두 테이블간에 일대 다 관계를 원한다.최대 절전 모드 주석은 내부 조인을 수행합니다.

create table assembly 
(
    assembly_id serial primary key, 
    number  text, 
    user_id  int 
); 

    create table assembly_properties 
(
    property_id serial primary key, 
    property_name text, 
    property_type  text 
); 

create table assembly_properties_mapping 
(
mapping_id  serial primary key, 
assembly_id  int, 
property_id  int, 
property_value text, 
CONSTRAINT FK_assembly_id FOREIGN KEY (assembly_id) REFERENCES assembly(assembly_id), 
CONSTRAINT FK_property_id  FOREIGN KEY (property_id)  REFERENCES assembly_properties(property_id) 
    ); 

나는이 3 개의 테이블을 postgres sql 데이터베이스에 만들었습니다. 다음은 내 Assembly.class 아래

 package com.development.wrapper; 


     @Entity 
     @Table(name = "assembly") 
     public class Assembly { 


      @Id 
      @GeneratedValue(strategy = GenerationType.IDENTITY) 
      @Column(name = "assembly_id") 
       private int assembly_id; 


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



      @Column(name ="UserID") 
      private int userId; 


      @Column 
      @ElementCollection(targetClass = AssemblyProperties.class) 
      private Set<AssemblyProperties> assembly_properties; 

      public int getAssembly_id() { 
       return assembly_id; 
      } 

      public void setAssembly_id(int assembly_id) { 
       this.assembly_id = assembly_id; 
      } 

      public String getNumber() { 
       return number; 
      } 

      public void setNumber(String number) { 
       this.number = number; 
      } 

      public int getUserId() { 
       return userId; 
      } 

      public void setUserId(int userId) { 
       this.userId = userId; 
      } 

      @OneToMany(targetEntity = AssemblyProperties.class, cascade = CascadeType.ALL) 
      @JoinTable(name = "assembly_properties_mapping", joinColumns = { @JoinColumn(name = "assembly_id") }, inverseJoinColumns = { @JoinColumn(name = "property_id") }) 


      public Set<AssemblyProperties> getAssembly_properties() { 
       return assembly_properties; 
      } 

      public void setAssembly_properties(Set<AssemblyProperties> assembly_properties) { 
       this.assembly_properties = assembly_properties; 
      } 

     } 

는 AssemblyProperties.class 패키지 com.development.wrapper이다;

 @Entity 
     @Table(name = "assembly_properties") 
     public class AssemblyProperties { 
      @Id 
      @GeneratedValue(strategy = GenerationType.IDENTITY) 
      @Column(name = "property_id") 
       private int property_id; 

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

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

      public int getProperty_id() { 
       return property_id; 
      } 

      public void setProperty_id(int property_id) { 
       this.property_id = property_id; 
      } 

      public String getProperty_name() { 
       return property_name; 
      } 

      public void setProperty_name(String property_name) { 
       this.property_name = property_name; 
      } 

      public String getProperty_type() { 
       return property_type; 
      } 

      public void setProperty_type(String property_type) { 
       this.property_type = property_type; 
      } 

     } 

은 내가 sessionFactory에 object.org.hibernate.MappingException를 만들지 못했습니다 오류 을 얻고 아래에 주어진 데이터베이스 테이블에 데이터를로드하려고 할 때 : com.development.wrapper :에 대한 유형을 판별 할 수 없습니다. 테이블에 AssemblyProperties : Assembly_assembly_properties, 컬럼 : [org.hibernate.mapping.Column (assembly_properties)] 스레드에서 예외는 "주요"java.lang.ExceptionInInitializerError 아래

코드는 내가

를 실행하려고한다
 public class Test 
     { 
      SessionFactory factory; 

      public Test() throws Exception 
      { 

        try 
        { 
          factory = new AnnotationConfiguration().configure(). 
           addPackage("com.development.wrapper"). //add package if used. 
              addAnnotatedClass(Assembly.class).buildSessionFactory(); 
        } 
        catch (Throwable ex) 
        { 
          System.err.println("Failed to create sessionFactory object." + ex); 
          throw new ExceptionInInitializerError(ex); 
        } 

      } 


      public Integer addClass(Assembly assembly) 
      { 
        Session session = factory.openSession(); 
        Transaction tx = null; 
        Integer assemblyid = null; 

        try 
        { 
          tx = session.beginTransaction(); 

          assemblyid = (Integer) session.save(assembly); 
          System.out.println(assemblyid); 
          tx.commit(); 
        } 
        catch (HibernateException e) 
        { 
          if (tx != null) 
            tx.rollback(); 
          e.printStackTrace(); 
        } 
        finally 
        { 
          session.close(); 
        } 
        return assemblyid; 
      } 

     public static void main(String[] args) throws Exception { 
      Set<AssemblyProperties> assemblyProperties = new HashSet<AssemblyProperties>(); 
      AssemblyProperties ass=new AssemblyProperties(); 
      ass.setProperty_name("xx"); 
      ass.setProperty_type("List"); 
      assemblyProperties.add(ass); 

      Assembly assembly =new Assembly(); 
      assembly.setAssembly_properties(assemblyProperties); 
      assembly.setNumber("aaa"); 
      assembly.setUserId(1); 
      Test test=new Test(); 
      test.addClass(assembly); 


     } 
     } 

이 오류를 해결하는 데 협조 해주십시오./미리 감사드립니다.

답변

0

Hibernate 공용 설정자 및 비공개 필드에 대한 주석이 하나의 클래스에서 혼합되는 경우 처리 할 수 ​​없습니다.

가능한 해결책은 비공개 필드와 공용 설정자간에 주석을 혼합하는 대신 공개 설정자에서 모든 주석을 작성하는 것입니다. 이렇게하면 publicprivate 액세스 수정 자 모두에 주석이있는 경우를 피할 수 있습니다. .

+0

일반적으로 필드/getter JPA 주석을 혼합 할 수 없으며 작동하지 않을 수 있습니다. –

0

귀하의 특수 효과가 충돌합니다. 이 :

@Column 
@ElementCollection(targetClass = AssemblyProperties.class) 
private Set<AssemblyProperties> assembly_properties; 

을이 :

@OneToMany(targetEntity = AssemblyProperties.class, cascade = CascadeType.ALL) 
@JoinTable(name = "assembly_properties_mapping", joinColumns = { @JoinColumn(name = "assembly_id") }, inverseJoinColumns = { @JoinColumn(name = "property_id") }) 
public Set<AssemblyProperties> getAssembly_properties() { 
       return assembly_properties; 
      } 

는 처음 annotaions 개인 필드 위에 (assembly_properties)를 제거합니다.

+0

이 @Column을 제거한 경우 @ ElementCollection (targetClass = AssemblyProperties.class) – Saurabh

+0

예, 위의 첫 번째 주석을 제거하십시오. – Moodi

+0

이 @ Column을 제거하면 @ElementCollection (targetClass = AssemblyProperties.class) 아래 오류가 발생했습니다. sessionFactory를 작성하지 못했습니다. object.org.hibernate.MappingException : 유형을 확인할 수 없습니다. java.util.Set, at table : assembly , 컬럼 : [org.hibernate.mapping.Column (assembly_properties)] – Saurabh