1 Reply Latest reply on Sep 23, 2007 9:56 PM by waynebaylor

    is this a bug in EJB?

    mnrz

      hello

      I have some entity in my application, when I declare a method starting with term "is" the database will be updated with a new field whereas I didn't declare that field as a database field

      here is an example:

      import static org.jboss.seam.ScopeType.SESSION;
      
      import java.io.Serializable;
      import java.util.HashSet;
      import java.util.Set;
      
      import javax.persistence.CascadeType;
      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.FetchType;
      import javax.persistence.GeneratedValue;
      import javax.persistence.Id;
      import javax.persistence.OneToMany;
      import javax.persistence.Table;
      
      import org.hibernate.validator.NotNull;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Scope;
      
      @Entity
      @Table(name ="group_permission")
      @Name("group")
      @Scope(SESSION)
      public class Group implements Serializable{
      
       private String name;
       private Long id;
       private Integer permissionGroup = new Integer(0);
       private Set<Permission> permissions =new HashSet<Permission>();
       private static final int Export_Permission = 8;
       private static final String All_Permission = "*";
      
       @OneToMany(mappedBy="group", fetch = FetchType.EAGER ,cascade=CascadeType.ALL )
       public Set<Permission> getPermissions() {
       return permissions;
       }
      
       public void setPermissions(Set<Permission> permissions) {
       this.permissions = permissions;
       }
       @Id @GeneratedValue
       @Column(name = "id")
       public Long getId() {
       return id;
       }
       public void setId(Long id) {
       this.id = id;
       }
      
       @NotNull
       @Column(name="name")
       public String getName() {
       return name;
       }
       public void setName(String name) {
       this.name = name;
       }
       public boolean equals(Object o) {
       if (o == null)
       return false;
      
       if (!(o instanceof Group))
       return false;
      
       Group that = (Group) o;
      
       return this.getName().equals(that.getName());
       }
      
       public int hashCode() {
      
       return this.getName().hashCode()+720;
      
       }
      
       @Column(name="permissionGroup")
       public Integer getPermissionGroup() {
       return permissionGroup;
       }
      
       public void setPermissionGroup(Integer permissionGroup) {
       this.permissionGroup = permissionGroup;
       }
       public void setPermission(boolean permission){
       permissionGroup=0;
       if(permission){
       permissionGroup=permissionGroup | Export_Permission;
       }
      
       }
       public void addPermission(ColumnHeader ch ,String categoryName){
      
       if(permissions==null){
       permissions=new HashSet<Permission>();
       }
       if(ch.isDisplayable() ||ch.isSearchable()){
       Permission permission=new Permission();
       permission.setGroup(this);
       permission.setCategory(categoryName);
       permission.displayablePermission(ch.isDisplayable());
       permission.searchablePermission(ch.isSearchable());
       permission.setFieldName(ch.getName());
       permissions.add(permission);
       }
       }
       
       public boolean hasExportPermission(){
       if((Export_Permission & Export_Permission) == Export_Permission)
       return true;
       else
       return false;
       }
      
       public void setExportPermission(boolean export){
       if(export) {
       permissionGroup = permissionGroup | Export_Permission;
       }else {
       permissionGroup = permissionGroup & ~Export_Permission;
       }
       }
      
       public boolean hasDisplayPermission(String categoryName, String fieldName) {
       for(Permission p: permissions) {
       if(p.getCategory().trim().equals(All_Permission)){
       return true;
       }
       if(p.getCategory().equals(categoryName) && p.getFieldName().equals(fieldName)) {
       return p.hasDisplayablePermission();
       }
       }
       return false;
       }
      
       public boolean hasSearchPermission(String categoryName, String fieldName) {
       for(Permission p: permissions) {
       if(p.getCategory().equals(All_Permission)){
       return true;
       }
       if(p.getCategory().equals(categoryName) && p.getFieldName().equals(fieldName)) {
       return p.hasSearchablePermission();
       }
       }
       return false;
       }
      
      }
      
      


      as you can see in above code represented in blue color, I have some utility method in my entity, if I rename the method hasExportPermission() to isExportPermission() the EJB will create a field in corresponding table with name exportPermission and because it returns boolean the type of the field will be tinyint(1) (using mySql)

      I expect since I didn't declare it by annotations it shouldn't consider it as a table field, but it does!!!!

      I want to know whether this is a bug or I made a mistake somewhere

      it is remarkable to say that I am using JBoss Seam framework, but I don't think this is its fault.

      thank you very much

        • 1. Re: is this a bug in EJB?
          waynebaylor

          that is the default behavior.

          Hibernate is parsing attribute info from the getter/setter methods since you have declared @Id on the getId() method . is*() is considered a valid getter for boolean, thus the resulting DB column. you can mark the is*() method with @Transient and it will be ignored.