Results 1 to 5 of 5

Thread: Integration test on many to one failing on insert constraint violation

  1. #1
    Join Date
    Mar 2008
    Posts
    249

    Default Integration test on many to one failing on insert constraint violation

    Hello,

    I have an Admin entity and an AdminOption entity.

    When running the integration tests, I get the following exception:

    Caused by: org.hibernate.exception.ConstraintViolationExcepti on: could not insert: [com.learnintouch.domain.AdminOption]

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Column 'admin_id' cannot be null

    Does Roo handle test data fixtures for many to one relations ?

    My entities were all generated from a database reverse engineering on a MySql schema.

    I'm using Roo 1.2.1.RELEASE [rev 6eae723]

    Here is more details on the tables structures and domain classes..

    Code:
    mysql> desc admin;
    +------------------+------------------+------+-----+---------+----------------+
    | Field            | Type             | Null | Key | Default | Extra          |
    +------------------+------------------+------+-----+---------+----------------+
    | id               | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | version          | int(10) unsigned | NO   |     | NULL    |                |
    | firstname        | varchar(255)     | NO   |     | NULL    |                |
    | lastname         | varchar(255)     | NO   |     | NULL    |                |
    | login            | varchar(50)      | NO   | UNI | NULL    |                |
    | password         | varchar(100)     | NO   |     | NULL    |                |
    | password_salt    | varchar(50)      | YES  |     | NULL    |                |
    | super_admin      | tinyint(1)       | NO   |     | NULL    |                |
    | preference_admin | tinyint(1)       | NO   |     | NULL    |                |
    | address          | varchar(255)     | YES  |     | NULL    |                |
    | zip_code         | varchar(10)      | YES  |     | NULL    |                |
    | city             | varchar(255)     | YES  |     | NULL    |                |
    | country          | varchar(255)     | YES  |     | NULL    |                |
    | email            | varchar(255)     | YES  |     | NULL    |                |
    | profile          | text             | YES  |     | NULL    |                |
    +------------------+------------------+------+-----+---------+----------------+
    15 rows in set (0.01 sec)
    
    mysql> desc admin_option;
    +----------+------------------+------+-----+---------+----------------+
    | Field    | Type             | Null | Key | Default | Extra          |
    +----------+------------------+------+-----+---------+----------------+
    | id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | version  | int(10) unsigned | NO   |     | NULL    |                |
    | name     | varchar(50)      | NO   |     | NULL    |                |
    | admin_id | int(10) unsigned | NO   | MUL | NULL    |                |
    | value    | varchar(20)      | YES  |     | NULL    |                |
    +----------+------------------+------+-----+---------+----------------+
    5 rows in set (0.00 sec)
    Code:
    @RooJavaBean
    @RooToString
    @RooJpaActiveRecord(table = "admin")
    @RooDbManaged(automaticallyDelete = true)
    public class Admin {
    
        @Column(name = "profile", columnDefinition = "TEXT")
        private String profile;
    }
    Code:
    privileged aspect Admin_Roo_DbManaged {
    
        @OneToMany(mappedBy = "adminId")
        private Set<AdminOption> Admin.adminOptions;
    
        public Set<AdminOption> Admin.getAdminOptions() {
            return adminOptions;
        }
    
        public void Admin.setAdminOptions(Set<AdminOption> adminOptions) {
            this.adminOptions = adminOptions;
        }
    
    }
    Code:
    privileged aspect Admin_Roo_Jpa_Entity {
    
        declare @type: Admin: @Entity;
    
        declare @type: Admin: @Table(name = "admin");
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id")
        private Integer Admin.id;
    
        @Version
        @Column(name = "version")
        private Integer Admin.version;
    
        public Integer Admin.getId() {
            return this.id;
        }
    
        public void Admin.setId(Integer id) {
            this.id = id;
        }
    
    }
    Code:
    @RooJavaBean
    @RooToString
    @RooJpaActiveRecord(table = "admin_option")
    @RooDbManaged(automaticallyDelete = true)
    public class AdminOption {
    }
    Code:
    privileged aspect AdminOption_Roo_DbManaged {
    
        @ManyToOne
        @JoinColumn(name = "admin_id", referencedColumnName = "id", nullable = false)
        private Admin AdminOption.adminId;
    
        public Admin AdminOption.getAdminId() {
            return adminId;
        }
    
        public void AdminOption.setAdminId(Admin adminId) {
            this.adminId = adminId;
        }
    
    }
    Code:
    privileged aspect AdminOption_Roo_Jpa_Entity {
    
        declare @type: AdminOption: @Entity;
    
        declare @type: AdminOption: @Table(name = "admin_option");
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id")
        private Integer AdminOption.id;
    
        @Version
        @Column(name = "version")
        private Integer AdminOption.version;
    
        public Integer AdminOption.getId() {
            return this.id;
        }
    
        public void AdminOption.setId(Integer id) {
            this.id = id;
        }
    
    }
    Stephane

  2. #2
    Join Date
    Mar 2008
    Posts
    249

    Default

    I attached the test source files.
    Attached Files Attached Files
    Stephane

  3. #3
    Join Date
    Mar 2008
    Posts
    249

    Default

    Here is what I get when running the test the classic Maven way:

    mvn clean test -Dtest=com.learnintouch.domain.AdminOptionIntegrati onTest

    Test set: com.learnintouch.domain.AdminOptionIntegrationTest
    -------------------------------------------------------------------------------
    Tests run: 9, Failures: 0, Errors: 8, Skipped: 0, Time elapsed: 18.875 sec <<< FAILURE!
    testCountAdminOptions(com.learnintouch.domain.Admi nOptionIntegrationTest) Time elapsed: 0.362 sec <<< ERROR!
    org.springframework.orm.jpa.JpaSystemException: org.hibernate.exception.ConstraintViolationExcepti on: could not insert: [com.learnintouch.domain.AdminOption]; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationExcepti on: could not insert: [com.learnintouch.domain.AdminOption]

    I also attached the full console output.
    Attached Files Attached Files
    Stephane

  4. #4
    Join Date
    Mar 2008
    Posts
    249

    Default

    I notice the AdminOptionDataOnDemand_Roo_DataOnDemand.aj class has a null adminId

    public void AdminOptionDataOnDemand.setAdminId(AdminOption obj, int index) {
    Admin adminId = null;
    obj.setAdminId(adminId);
    }

    Am I allowed to edit that ? Should I do it in the AdminOptionDataOnDemand.java class ?

    Has anyone tips on customizing the data on demand ?
    Stephane

  5. #5
    Join Date
    Mar 2008
    Posts
    249

    Default

    I did again a database reverse engineering, this time with the option --testAutomatically as in

    database reverse engineer --package ~.domain --schema PUBLIC --testAutomatically

    and the AdminOptionDataOnDemand_Roo_DataOnDemand.aj class now has an instance of an admin

    public void AdminOptionDataOnDemand.setAdminId(AdminOption obj, int index) {
    Admin adminId = adminDataOnDemand.getRandomAdmin();
    obj.setAdminId(adminId);
    }

    Maybe, generating the integration tests one by one was why Roo didn't generate the test data fixtures for many to one relations.
    Stephane

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •