-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: m:n Beziehung und Composite-ID Problem
PostPosted: Thu Jan 07, 2010 6:35 am 
Newbie

Joined: Mon Oct 19, 2009 5:02 pm
Posts: 3
Hi,

ich habe 2 Klassen, Leistung und Buchung und eine Klasse BuchungLeistung, die eine m:n Beziehung zwischen den beiden anderen Klassen herstellt.
In dieser Zwischentabelle BuchungLeistung möchte ich gerne einen zusammengesetzten Primärschlüssel aus Buchung_ID und Leistung_ID haben. Leider habe ich das bisher nicht hinbekommen. Ein extra PK für die Zwischentabelle funktioniert zwar, ist aber nicht das was ich möchte.

das Mapping der m:n Klasse
Code:
hibernate-mapping package="model">
   <class name="BuchungLeistung" table="BuchungLeistung">
      <!--  <id name="id" column="BuchungLeistung_ID">
         <generator class="native" />
      </id>-->
      <composite-id name="pk">
          <key-many-to-one name="leistung" column="Leistung_ID" class="Leistung" />
          <key-many-to-one name="buchung" column="Buchung_ID" class="Buchung" />
          <!--
         <key-property name="leistung" column="Leistung_ID">
         </key-property>
         <key-property name="buchung" column="Buchung_ID">
         </key-property> -->
      </composite-id>
      <property name="anzahl" column="Anzahl" />
      
      <many-to-one name="leistung" column="Leistung_ID" not-null="true" lazy="false"/>
      <many-to-one name="buchung" column="Buchung_ID" not-null="true" />
   </class>
</hibernate-mapping>


Die m:n Klasse
Code:
public class BuchungLeistung {

   //private long id;
   private int anzahl;
   
   private Buchung buchung;
   private Leistung leistung;
   
   public BuchungLeistung() {
      
   }
...


Wäre super wenn da jmd ein paar Tips hätte, wie das zu lösen ist.

Schöne Grüße
Daniel


Top
 Profile  
 
 Post subject: Re: m:n Beziehung und Composite-ID Problem
PostPosted: Fri Jan 08, 2010 9:11 am 
Newbie

Joined: Mon Aug 31, 2009 6:30 am
Posts: 9
Location: Bolzano, Italy
Hallo Daniel,

Wie sieht denn die genaue Fehlermeldung für Dein Problem aus?

Eine Idee, warum es nicht funktioniert, könnte folgende sein:

<key-many-to-one name="leistung" column="Leistung_ID" class="Leistung" />

Beim class-Attribut wird wahrscheinlich der Assembly-Name fehlen (findest Du hier bzw. kannst ihn hier setzen: Rechtsklick aufs VS-Projekt->Properties->Assembly name.

Normalerweise setzt man den so:
<key-many-to-one name="leistung" column="Leistung_ID" class="Leistung, DeinAssemblyName" />

Ich hoffe, damit ist Dir schon mal weiter geholfen.

Viele Grüße,
Martin

_________________
Tutorials and solved problems under:
http://angler.wordpress.com


Top
 Profile  
 
 Post subject: Re: m:n Beziehung und Composite-ID Problem
PostPosted: Fri Jan 08, 2010 9:25 am 
Newbie

Joined: Mon Oct 19, 2009 5:02 pm
Posts: 3
Hallo Martin,

die genaue Fehlermeldung lautet:
Code:
14:14:12,203 DEBUG Configuration:1634 - null<-org.domException in thread "main" java.lang.ExceptionInInitializerError
   at hibUtils.SessionFactoryUtil.<clinit>(SessionFactoryUtil.java:18)
   at model.DatabaseService.getPersonen(DatabaseService.java:109)
   at tableModels.PersonenTableModel.<init>(PersonenTableModel.java:28)
   at delegate.MainWindow.createTable(MainWindow.java:650)
   at delegate.MainWindow.<init>(MainWindow.java:639)
   at Hotelverwaltung.main(Hotelverwaltung.java:15)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource cfg/BuchungLeistung.hbm.xml4j.tree.DefaultAttribute@1b4fad5


Was genau du mit Assembly Name meinst habe ich nicht verstanden. Ich entwickle unter Java mit Eclipse.

Gruß
Daniel


Top
 Profile  
 
 Post subject: Re: m:n Beziehung und Composite-ID Problem
PostPosted: Fri Jan 08, 2010 9:27 am 
Newbie

Joined: Mon Aug 31, 2009 6:30 am
Posts: 9
Location: Bolzano, Italy
Klar,

War mein Fehler. :-)

Danke für die Fehlermeldung, werd ich mir umgehend anschauen.

Viele Grüße,
Martin

_________________
Tutorials and solved problems under:
http://angler.wordpress.com


Top
 Profile  
 
 Post subject: Re: m:n Beziehung und Composite-ID Problem
PostPosted: Thu Jan 14, 2010 9:50 am 
Newbie

Joined: Fri Aug 22, 2008 6:12 am
Posts: 13
Hallo,

ich sitz gerade an nem ähnlichen Problem. Hab die m:n Beziehung mit einer Zwischentabelle und @IdClass gelöst. Ich hab:
Inventory <-n:1-> InventoryUser <-1:m-> User
Mein Problem ist jetzt aber, dass die Schlüssel von InventoryUser nicht die Werte der Schlüssel von Inventory und User annehmen, wenn ich neu in die Datenbank schreibe!

Code:
@Entity
public class Inventory {

    private Long id;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "INVENTORY_ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    private List<InventoryUser> inventoryUser = new ArrayList<InventoryUser>();

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "inventory")
    public List<InventoryUser> getInventoryUser() {
        return inventoryUser;
    }

    public void setInventoryUser(List<InventoryUser> productUser) {
        this.inventoryUser = productUser;
    }
    // more attributes


Code:
@Entity
@Table(name = "User_Table")
public class User {
    private String id;

    @Id
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private Set<InventoryUser> inventoryUser = new LinkedHashSet<InventoryUser>();

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
    public Set<InventoryUser> getInventoryUser() {
        return inventoryUser;
    }

    public void setInventoryUser(Set<InventoryUser> inventoryUser) {
        this.inventoryUser = inventoryUser;
    }

    // more attributes


and the intermediate entity

Code:
@Entity
@Table(name = "Inventory_User")
@IdClass(InventoryUser.ProductUserPK.class)
public class InventoryUser {

    private Long inventoryId;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getInventoryId() {
        return inventoryId;
    }

    public void setInventoryId(Long inventoryId) {
        this.inventoryId = inventoryId;
    }

    private String userId;

    @Id
    public String getUserId() {
        return userId;
    }

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

    private User user;

    @ManyToOne
    @JoinColumn(name = "userId", insertable = false)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    private Inventory inventory;

    @ManyToOne
    @JoinColumn(name = "INVENTORY_ID", insertable = false)
    public Inventory getInventory() {
        return inventory;
    }

    public void setInventory(Inventory inventory) {
        this.inventory = inventory;
    }

    private Date obtainDate = new Date();

    @Basic
    public Date getObtainDate() {
        return obtainDate;
    }

    public void setObtainDate(Date obtainDate) {
        this.obtainDate = obtainDate;
    }

    public static class ProductUserPK implements Serializable {
        private Long inventoryId;
        private String userId;

        public Long getInventoryId() {
            return inventoryId;
        }

        public void setInventoryId(Long inventoryId) {
            this.inventoryId = inventoryId;
        }

        public String getUserId() {
            return userId;
        }

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

        @Override
        public boolean equals(Object o) ...

        @Override
        public int hashCode() ...
    }
}


So füge ich das ganze zusammen:

Code:
        Inventory inventory = new Inventory();
        User user = new User();
        InventoryUser inventoryUser = new InventoryUser();
       
        inventoryUser.setInventory(inventory);
        inventoryUser.setUser(user);
     
        inventory.getInventoryUser().add(inventoryUser);
        user.getInventoryUser().add(inventoryUser);


und kriege dann so einen Fehler:

Code:
Could not execute JDBC batch update [insert into Inventory_User (obtainDate, INVENTORY_ID, userId) values (?, ?, ?)]
java.sql.BatchUpdateException: Column 'INVENTORY_ID' cannot be null

_________________
believing in the impossible makes it possible


Top
 Profile  
 
 Post subject: Re: m:n Beziehung und Composite-ID Problem
PostPosted: Thu Jan 14, 2010 9:51 am 
Newbie

Joined: Fri Aug 22, 2008 6:12 am
Posts: 13
Sorry, aus versehen 2 mal geposted...

_________________
believing in the impossible makes it possible


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.